// import { md5Sign } from '@/utils/md5.js'
const GLOBALCONFIG = require('@/config')
import store from 'store'

// 这里的vm，就是我们在vue文件里面的this
const install = (Vue, vm) => {
  const BaseUrl = GLOBALCONFIG.VUE_APP_BASE_API

  const token = uni.getStorageSync('token') || ''
  Vue.prototype.$u.http.setConfig({
    baseUrl: BaseUrl,
    showLoading: false, // 是否显示请求中的loading
    loadingText: '请求中...', // 请求loading中的文字提示
    loadingTime: 800, // 在此时间内，请求还没回来的话，就显示加载中动画，单位ms
    loadingMask: true, // 展示loading的时候，是否给一个透明的蒙层，防止触摸穿透
    timeout: 20 * 1000,
    header: {
      'Access-Control-Allow-Headers': 'x-requested-with,content-type',
      'Access-Control-Allow-Origin': '*',
      // 'Content-Type': 'application/json',
      Authorization: 'Bearer ' + token + '',
    },
  })
  // 请求拦截，配置Token等参数
  Vue.prototype.$u.http.interceptor.request = (config) => {
    // 从vuex中读取缓存
    // const token = vm.$store.state.token;
    // 从缓存中读取token
    const token = uni.getStorageSync('token') || ''
    const tokenHead = uni.getStorageSync('tokenHead') || ''
    config.header.Authorization = tokenHead + ' ' + token

    // 读自定义的参数
    const { contentType, auth } = config.header.diy
    console.log('store.state=', store.state)
    // 如果接口有登录权限且无token时跳登录
    if (auth && !token) {
      // 跳转加锁,防止多次跳转
      if (!store.state.user.isLoginJumpLock) {
        uni.showToast({
          title: '请先登录后再访问',
          icon: 'none',
          duration: 1000,
          mask: true,
        })
        console.log('加锁了 -1', Date.now())
        store.dispatch('user/setLoginLock', true)
        setTimeout(() => {
          vm.$Router.push({ name: 'login' })
        }, 1000)
      }
      console.log('store.state=', store.state)
      throw `暂未登录,已阻止此次API请求: '${config.url}'`
    }

    // 设置不同的Content-Type
    if (contentType) {
      if (contentType === '!json') {
        config.header['Content-Type'] = 'application/x-www-form-urlencoded'
        console.log('修改header请求方式===', config.header)
      } else if (contentType === 'upload') {
        config.header['Content-Type'] = 'multipart/form-data'
        console.log('修改header请求方式===', config.header)
      } else {
        config.header['Content-Type'] = 'application/json'
        console.log('修改header请求方式===', config.header)
      }
    }

    console.log('修改config后', config, Date.now())

    // 可以对某个url进行特别处理，此url参数为this.$u.get(url)中的url值
    // if(config.url == '/user/login') config.header.noToken = true;
    // 如果return一个false值，则会取消本次请求
    // if(config.url == '/user/rest') return false; // 取消某次请求
    // 如果需要登陆的地方用户没有登陆，则提示
    // if (config.data.toast && !token) {
    // 	uni.showModal({
    // 		title: '提示',
    // 		content: config.data.toast,
    // 		success(res) {
    // 			if (res.confirm) {
    // 				uni.navigateTo({
    // 					url: '/pages/login/login'
    // 				})
    // 			}
    // 		}
    // 	})
    // delete config.data.toast;
    // return false
    // }
    // 添加签名
    // config.data = config.data || {};
    // config.data = md5Sign(config.data);
    // 最后需要将config进行return
    return config
  }

  // 响应拦截，判断状态码是否通过
  Vue.prototype.$u.http.interceptor.response = (res) => {
    console.log('res interceptor', res)
    // return res
    if (res.code === 200 || res.code === 201 || res.code === 210 || res.code === 220) {
      // res为服务端返回值，可能有code，result等字段
      // 这里对res.result进行返回，将会在this.$u.post(url).then(res => {})的then回调中的res的到
      // 如果配置了originalData为true，请留意这里的返回值
      return res
    } else if (res.code === 401) {
      // 暂未登录或token已经过期
      vm.$u.toast(res.message)
      setTimeout(() => {
        vm.$Router.push({ name: 'login', type: 'replace' })
      }, 1000)
      return res
    } else if (res.code === 602) {
      // 接口报错，跳转到报错页
      // vm.$u.toast(res.message)
      // setTimeout(() => {
      //   vm.$Router.replace({ name: 'errorIndex' })
      // }, 1000)
      // return res
    } else {
      // 如果返回false，则会调用Promise的reject回调，
      // 并将进入this.$u.post(url).then().catch(res=>{})的catch回调中，res为服务端的返回值

      vm.$u.toast(res.message)
      // setTimeout(function() {
      // 	uni.navigateBack({
      // 		delta: 1
      // 	});
      // }, 2000)
      return false
      // return res
    }
  }
}

export default {
  install,
}
